package controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;

import bank.Kunde;
import view.AnlegenKontoDlg;
import view.AnlegenKundeDlg;
import view.BankView;
import view.EinAuszahlenDlg;

public class CtlBankView {
	private BankView bankView;
	private AnlegenKundeDlg anlegenKundeDlg;
	private AnlegenKontoDlg anlegenKontoDlg;
	private EinAuszahlenDlg einAuszahlenDlg;
	private BankHandler bankHandler;

	public CtlBankView() {
	}

	public void startBankView(BankHandler bankHandler) {
		this.bankHandler = bankHandler;
		bankView = new BankView();
		bankView.getAnlegenKunde().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				anlegenKundenActionPerformed();
			}
		});
		bankView.getDurchfuehrenZahlungen().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				einAuszahlenActionPerformed();
			}
		});
		bankView.getAnlegenKonto().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				anlegenKontoActionPerformed();
			}
		});
		bankView.setVisible(true);
	}

	private void anlegenKundenActionPerformed() {
		anlegenKundeDlg = new AnlegenKundeDlg(bankView, true);
		anlegenKundeDlg.getBtAnlegen().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				btAnlegenKundeActionPerformed();
			}
		});
		anlegenKundeDlg.getBtEnde().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				jButtonKundeAnlegenBeendenActionPerformed();
			}
		});
	}

	private void btAnlegenKundeActionPerformed() {
		try {
			int kundenNummer = Integer.parseInt(anlegenKundeDlg.getTfNummer()
					.getText());
			String kundenName = anlegenKundeDlg.getTfName().getText();
			Kunde neuerKunde = bankHandler.anlegenKunde(kundenName,
					kundenNummer);
			new JOptionPane();
			JOptionPane.showMessageDialog(anlegenKundeDlg, "Kunde:"
					+ neuerKunde.getName() + " angelegt.");
			clearDlgKundeAnlegen();
		} catch (NumberFormatException e) {
			new JOptionPane();
			JOptionPane.showMessageDialog(anlegenKundeDlg,
					"Bitte Zahl als Kundennummer eingeben.");
		}
	}
	
	private void clearDlgKundeAnlegen() {
		anlegenKundeDlg.getTfName().setText("");
		anlegenKundeDlg.getTfNummer().setText("");
	}

	private void jButtonKundeAnlegenBeendenActionPerformed() {
		anlegenKundeDlg.dispose();
	}
	
	private void einAuszahlenActionPerformed() {
		einAuszahlenDlg = new EinAuszahlenDlg(bankView, true);
		einAuszahlenDlg.getBtKontostand().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				try {
					btKontostandActionPerformed();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		einAuszahlenDlg.getBtEnde().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				jButtonEinAuszahlenBeendenActionPerformed();
			}
		});
		einAuszahlenDlg.getBtAuszahlung().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				//ToDo: implement the  btAuszahlenActionPerformed()
				try {
					btAuszahlenActionPerformed();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		einAuszahlenDlg.getBtEinzahlung().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				//ToDo: implement the  btEInzahlenActionPerformed()
				try {
					btEinzahlenActionPerformed();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
	}
	
	private void btKontostandActionPerformed() throws Exception {
		try {
			int kontoNummer = Integer.parseInt(einAuszahlenDlg.getTfKontonummer()
					.getText());
			//System.out.println(kontoNummer);
			bankHandler.getKundeByKontoNummer(kontoNummer);
			try {
			new JOptionPane();
			JOptionPane.showMessageDialog(einAuszahlenDlg, "Kontostand:"
					+ bankHandler.getKundeByKontoNummer(kontoNummer).getKontostand(kontoNummer));
			double ktoStand = bankHandler.getKundeByKontoNummer(kontoNummer).getKontostand(kontoNummer);
			String kontoStand = Double.toString(ktoStand);
			einAuszahlenDlg.getTfAlterKontostand().setText(kontoStand);
			} catch (NullPointerException e) {
				new JOptionPane();
				JOptionPane.showMessageDialog(einAuszahlenDlg,
						"Ein Konto mit dieser Nummer exestiert nicht.");
			}
			//clearDlgEinAuszahlen();
		} catch (NumberFormatException e) {
			new JOptionPane();
			JOptionPane.showMessageDialog(einAuszahlenDlg,
					"Bitte Zahl als Kontonummer eingeben.");
		}
	}

	private void clearDlgEinAuszahlen() {
		einAuszahlenDlg.getTfBetrag().setText("");
	}

	private void btAuszahlenActionPerformed() throws Exception {
		//ToDo: do something
		try{
			int kontoNummer = Integer.parseInt(einAuszahlenDlg.getTfKontonummer()
					.getText());
			double betrag = Double.parseDouble(einAuszahlenDlg.getTfBetrag()
					.getText());
			double alterKontostand = bankHandler.getKundeByKontoNummer(kontoNummer).getKontostand(kontoNummer);
			
			double neuerKontostand = bankHandler.getKundeByKontoNummer(kontoNummer).auszahlenBetrag(kontoNummer, betrag);
			einAuszahlenDlg.getTfAlterKontostand().setText(Double.toString(alterKontostand));
			einAuszahlenDlg.getTfNeuerKontostand().setText(Double.toString(neuerKontostand));
			clearDlgEinAuszahlen();
		}catch(Exception e){
			new JOptionPane();
			JOptionPane.showMessageDialog(einAuszahlenDlg,
					e.getMessage());
		}
	}
	
	private void btEinzahlenActionPerformed() throws Exception{
		try{
			int kontoNummer = Integer.parseInt(einAuszahlenDlg.getTfKontonummer()
					.getText());
			double betrag = Double.parseDouble(einAuszahlenDlg.getTfBetrag()
					.getText());
			double alterKontostand = bankHandler.getKundeByKontoNummer(kontoNummer).getKontostand(kontoNummer);
			
			double neuerKontostand = bankHandler.getKundeByKontoNummer(kontoNummer).einzahlenBetrag(kontoNummer, betrag);
			
			einAuszahlenDlg.getTfAlterKontostand().setText(Double.toString(alterKontostand));
			einAuszahlenDlg.getTfNeuerKontostand().setText(Double.toString(neuerKontostand));
			clearDlgEinAuszahlen();
		}
		catch(Exception e){
			
		}
	}
	
	private void jButtonEinAuszahlenBeendenActionPerformed() {
		einAuszahlenDlg.dispose();
		
	}
	
	
	
	
	
	private void anlegenKontoActionPerformed() {
		anlegenKontoDlg = new AnlegenKontoDlg(bankView, true);
		anlegenKontoDlg.getBtAnlegen().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				try {
					btAnlegenKontoActionPerformed();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		anlegenKontoDlg.getBtEnde().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				jButtonKontoAnlegenBeendenActionPerformed();
			}
		});
	}
	
	private void btAnlegenKontoActionPerformed() throws Exception {
		
		try {
			int kundenNummer = Integer.parseInt(anlegenKontoDlg.getTfName()
					.getText());
			String kontoArt = anlegenKontoDlg.getCbKontoArt().getSelectedItem().toString();
			System.out.println(bankHandler.getKundeByKundenNummer(kundenNummer).getName());
			System.out.println(kontoArt);
			int kontoArtFinal = 0;
			if(kontoArt == "Girokonto"){ kontoArtFinal = 1;}
			bankHandler.getKundeByKundenNummer(kundenNummer).anlegenKonto(kontoArtFinal);
			System.out.println(bankHandler.getKundeByKundenNummer(kundenNummer).anlegenKonto(kontoArtFinal).getKontonummer());
			clearDlgKontoAnlegen();
		} catch (NumberFormatException e) {
			new JOptionPane();
			JOptionPane.showMessageDialog(anlegenKontoDlg,
					"Bitte Zahl als Kundennummer eingeben.");
		}
	}
	
	private void clearDlgKontoAnlegen() {
		anlegenKontoDlg.getTfName().setText("");
	}

	private void jButtonKontoAnlegenBeendenActionPerformed() {
		anlegenKontoDlg.dispose();
	}

}
